package ui

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	"ip-parser/internal/logger"
	"ip-parser/internal/plugins"
)

// UIManager UI管理器
type UIManager struct {
	running bool
	scanner *bufio.Scanner
	logger  *logger.Logger
	// 当前使用的插件
	currentPlugin     plugins.Plugin
	currentPluginName string
}

// NewUIManager 创建新的UI管理器
func NewUIManager() *UIManager {
	return &UIManager{
		scanner: bufio.NewScanner(os.Stdin),
		logger:  logger.NewLogger(),
	}
}

// Start 启动UI交互
func (m *UIManager) Start(pluginManager *plugins.PluginManager) {
	m.running = true
	m.logger.Banner()

	for m.running {
		var prompt string
		if m.currentPluginName != "" {
			prompt = fmt.Sprintf("(%s) > ", m.currentPluginName)
		} else {
			prompt = "> "
		}

		m.logger.Info("请输入命令 (输入 'help' 或 'h' 查看帮助):")
		fmt.Print(prompt)
		if !m.scanner.Scan() {
			break
		}

		command := strings.TrimSpace(m.scanner.Text())
		if command == "" {
			continue
		}

		m.handleCommand(command, pluginManager)
	}
}

// Stop 停止UI交互
func (m *UIManager) Stop() {
	m.running = false
}

// handleCommand 处理用户命令
func (m *UIManager) handleCommand(command string, pluginManager *plugins.PluginManager) {
	parts := strings.Fields(command)
	if len(parts) == 0 {
		return
	}

	// 如果当前在插件中且命令为 h/help，则显示插件帮助
	if m.currentPluginName != "" && (parts[0] == "h" || parts[0] == "help") {
		m.showPluginHelp()
		return
	}

	// 如果当前在插件中且命令为 back/b，则返回主菜单
	if m.currentPluginName != "" && (parts[0] == "back" || parts[0] == "b") {
		m.logger.Info("返回主菜单")
		m.currentPlugin = nil
		m.currentPluginName = ""
		return
	}

	// 如果当前在插件中且命令为 run/r，则执行插件
	if m.currentPluginName != "" && (parts[0] == "run" || parts[0] == "r") {
		m.runCurrentPlugin(pluginManager)
		return
	}

	// 如果当前在插件中且命令包含等号，则设置参数
	if m.currentPluginName != "" && strings.Contains(command, "=") {
		m.setPluginParam(command)
		return
	}

	// 处理全局命令
	switch parts[0] {
	case "help", "h":
		m.showHelp()
	case "list", "l":
		m.listPlugins(pluginManager)
	case "use", "u":
		if len(parts) < 2 {
			m.logger.Error("请指定要使用的插件名称")
			return
		}
		m.usePlugin(parts[1], pluginManager)
	case "exit", "quit", "q":
		m.logger.Info("正在退出...")
		m.Stop()
	default:
		m.logger.Error("未知命令，输入 'help' 或 'h' 查看帮助")
	}
}

// showHelp 显示帮助信息
func (m *UIManager) showHelp() {
	m.logger.Separator()
	m.logger.Info("可用命令:")
	m.logger.Table(
		[]string{"命令", "简写", "描述"},
		[][]string{
			{"help", "h", "显示帮助信息"},
			{"list", "l", "列出所有可用插件"},
			{"use <插件名>", "u <插件名>", "使用指定的插件"},
			{"exit", "q", "退出程序"},
			{"", "", ""},
			{"-- 插件模式命令 --", "", ""},
			{"help", "h", "显示当前插件帮助"},
			{"back", "b", "返回主菜单"},
			{"run", "r", "执行当前插件"},
			{"<param>=<value>", "", "设置插件参数"},
		},
	)
	m.logger.Separator()
}

// listPlugins 列出所有可用插件
func (m *UIManager) listPlugins(pluginManager *plugins.PluginManager) {
	m.logger.Separator()
	m.logger.Info("可用插件:")

	var rows [][]string
	plugins := pluginManager.ListPlugins()
	for _, info := range plugins {
		rows = append(rows, []string{info.Name, info.Description})
	}

	m.logger.Table(
		[]string{"插件名", "描述"},
		rows,
	)
	m.logger.Separator()
}

// usePlugin 使用指定插件
func (m *UIManager) usePlugin(pluginName string, pluginManager *plugins.PluginManager) {
	plugin, err := pluginManager.GetPlugin(pluginName)
	if err != nil {
		m.logger.Error("插件不存在: %s", pluginName)
		return
	}

	m.currentPlugin = plugin
	m.currentPluginName = pluginName

	pluginInfo, _ := pluginManager.GetPluginInfo(pluginName)
	m.logger.Success("已选择插件: %s", pluginName)
	m.logger.Info("描述: %s", pluginInfo.Description)
	m.logger.Info("输入 'help' 或 'h' 查看该插件的参数说明")
}

// showPluginHelp 显示当前插件的帮助信息
func (m *UIManager) showPluginHelp() {
	if m.currentPlugin == nil {
		m.logger.Error("未选择插件")
		return
	}

	m.logger.Separator()
	m.logger.Info("插件: %s", m.currentPluginName)
	m.logger.Info("描述: %s", m.currentPlugin.GetDescription())
	m.logger.Info("参数列表:")

	params := m.currentPlugin.GetRequiredParams()
	var rows [][]string
	for _, param := range params {
		required := "否"
		if param.Required {
			required = "是"
		}
		defaultValue := param.Default
		if defaultValue == "" {
			defaultValue = "-"
		}
		rows = append(rows, []string{param.Name, param.Description, required, defaultValue})
	}

	m.logger.Table(
		[]string{"参数名", "描述", "必填", "默认值"},
		rows,
	)

	m.logger.Info("使用方法:")
	m.logger.Info("1. 设置参数: param=value")
	m.logger.Info("2. 执行插件: run 或 r")
	m.logger.Info("3. 返回主菜单: back 或 b")
	m.logger.Separator()
}

// 插件参数临时存储
var pluginParams = make(map[string]map[string]interface{})

// setPluginParam 设置插件参数
func (m *UIManager) setPluginParam(command string) {
	if m.currentPlugin == nil || m.currentPluginName == "" {
		m.logger.Error("未选择插件")
		return
	}

	parts := strings.SplitN(command, "=", 2)
	if len(parts) != 2 {
		m.logger.Error("参数格式错误，请使用 key=value 格式")
		return
	}

	key := strings.TrimSpace(parts[0])
	value := strings.TrimSpace(parts[1])

	// 检查是否是数字
	if strings.Contains(value, ".") {
		// 尝试转换为浮点数，这里简化处理，实际可能需要更复杂的转换
		m.logger.Info("将参数 %s 设置为浮点数: %s", key, value)
	} else if value == "true" || value == "false" {
		// 尝试转换为布尔值
		m.logger.Info("将参数 %s 设置为布尔值: %s", key, value)
	} else {
		// 默认为字符串
		m.logger.Info("将参数 %s 设置为字符串: %s", key, value)
	}

	// 初始化参数映射
	if _, exists := pluginParams[m.currentPluginName]; !exists {
		pluginParams[m.currentPluginName] = make(map[string]interface{})
	}

	// 设置参数
	pluginParams[m.currentPluginName][key] = value
	m.logger.Success("参数设置成功: %s = %s", key, value)
}

// runCurrentPlugin 运行当前插件
func (m *UIManager) runCurrentPlugin(pluginManager *plugins.PluginManager) {
	if m.currentPlugin == nil || m.currentPluginName == "" {
		m.logger.Error("未选择插件")
		return
	}

	// 获取插件参数
	args := make(map[string]interface{})
	if params, exists := pluginParams[m.currentPluginName]; exists {
		for k, v := range params {
			args[k] = v
		}
	}

	// 检查必填参数
	params := m.currentPlugin.GetRequiredParams()
	missingParams := []string{}
	for _, param := range params {
		if param.Required {
			if _, exists := args[param.Name]; !exists && param.Default == "" {
				missingParams = append(missingParams, param.Name)
			} else if _, exists := args[param.Name]; !exists && param.Default != "" {
				// 使用默认值
				args[param.Name] = param.Default
			}
		}
	}

	if len(missingParams) > 0 {
		m.logger.Error("缺少必填参数: %s", strings.Join(missingParams, ", "))
		return
	}

	m.logger.Info("开始执行插件...")
	if err := m.currentPlugin.Execute(args); err != nil {
		m.logger.Error("插件执行失败: %v", err)
	} else {
		m.logger.Success("插件执行完成")
	}

	// 清空插件参数
	delete(pluginParams, m.currentPluginName)
}

// usePlugin 使用指定插件（旧版本代码，用于兼容）
func (m *UIManager) usePluginOld(pluginName string, pluginManager *plugins.PluginManager) {
	plugin, err := pluginManager.GetPlugin(pluginName)
	if err != nil {
		m.logger.Error("插件不存在: %s", pluginName)
		return
	}

	m.logger.Success("已选择插件: %s", pluginName)
	m.logger.Info("请输入参数 (格式: key=value，输入 'done' 完成):")

	args := make(map[string]interface{})
	for {
		fmt.Print("> ")
		if !m.scanner.Scan() {
			break
		}

		input := strings.TrimSpace(m.scanner.Text())
		if input == "done" {
			break
		}

		parts := strings.SplitN(input, "=", 2)
		if len(parts) != 2 {
			m.logger.Error("参数格式错误，请使用 key=value 格式")
			continue
		}

		key := strings.TrimSpace(parts[0])
		value := strings.TrimSpace(parts[1])
		args[key] = value
	}

	m.logger.Info("开始执行插件...")
	if err := plugin.Execute(args); err != nil {
		m.logger.Error("插件执行失败: %v", err)
	} else {
		m.logger.Success("插件执行完成")
	}
}
